import { validateConfig } from './config-validator';
/**
 * 创建组件配置
 * @param {Object} config 组件配置对象
 * @returns {Object} 完整的组件配置对象
 * @throws {Error} 如果配置无效则抛出错误
 */
export function createComponent(config) {
  // 验证配置
  validateConfig(config);

  // 处理分组属性
  const processProps = (props) => {
    const result = {};
    for (const [key, prop] of Object.entries(props || {})) {
      if (prop.group === true) {
        // 处理分组属性
        Object.assign(result, processProps(prop.props));
      } else {
        // 处理条件属性
        const conditionalProps = {};
        if (prop.conditionalProps) {
          for (const condProp of prop.conditionalProps) {
            if (condProp.when(config)) {
              Object.assign(conditionalProps, condProp.then);
            }
          }
        }

        // 合并基础属性和条件属性
        result[key] = {
          ...prop,
          ...conditionalProps,
          // 添加默认编辑器属性
          editorProps: {
            ...(prop.editorProps || {}),
            placeholder: prop.editorProps?.placeholder || `请输入${prop.label || key}`
          }
        };
      }
    }
    return result;
  };

  const processedConfig = {
    ...config,
    // 确保组件配置有默认值
    canBeSlotContent: config.canBeSlotContent !== undefined ? config.canBeSlotContent : true,
    props: processProps(config.props),
    events: config.events || {},
    slots: config.slots || {},
    childComponents: config.childComponents || [],
    // 添加默认分类
    category: config.category || 'default'
  };

  // 二次验证处理后的配置
  validateConfig(processedConfig);
  return processedConfig;
}

/**
 * 合并多个组件配置
 * @param {...Object} configs 要合并的组件配置
 * @returns {Object} 合并后的配置
 */
export function mergeComponentConfigs(...configs) {
  const baseConfig = {};
  for (const config of configs) {
    if (!config) continue;
    
    // 深度合并props
    if (config.props) {
      baseConfig.props = baseConfig.props || {};
      for (const [key, prop] of Object.entries(config.props)) {
        if (baseConfig.props[key]) {
          // 合并属性配置
          baseConfig.props[key] = {
            ...baseConfig.props[key],
            ...prop,
            editorProps: {
              ...(baseConfig.props[key].editorProps || {}),
              ...(prop.editorProps || {})
            }
          };
        } else {
          baseConfig.props[key] = prop;
        }
      }
    }

    // 合并其他配置
    Object.assign(baseConfig, config);
  }
  
  return createComponent(baseConfig);
}

